/**
 * nodejs对文件的操作模块是fs模块
 *      1、fs这个模块中的方法基本都分为两种形式，同步和异步
 *         方法有Sync结尾的就是同步错做
 *         对应的一定有一个没有Syns结尾的方法，那这个就是异步的
 *         同步文件会阻塞后面的代码执行
 *      2、fs模块需要掌握的方法  fs模块中回调函数的第一个参数一般都是err(错误)
 *          appendFile    追加到文件
 *          copyFile      复制一个文件到另一个文件
 *          readFile      读取文件全部内容
 *          writeFile     写入文件(文件存在则会覆盖)
 *          unlink        删除文件
 *          open          打开文件
 *          mkdir         创建文件
 *          readdir       读取文件夹中的所有内容
 *          rmdir         删除文件夹（只能删除空的文件夹）
 *          stat          检查文件都的状态
 *          rename        文件重命名
 *  */

const fs = require('fs'),
      path = require("path");  
//追加文件内容
    // fs.appendFile("./test/1.txt","这个代码是追加的文件",{encoding:"utf-8"},function(err){
    //     if(err) return ;
    //     console.log("文件追加成功了吗append")
    // })
// 复制文件
    // fs.copyFile("./test/1.txt","./test/3.txt",function(err){
    //     if(err) return ;
    //     console.log("文件复制成功了吗copyFile")
    // })
// 写文件（注意：写文件会覆盖文件原有的内容）
    // fs.writeFile("./test/1.txt","这是异步写入的文件",{encoding:"utf-8"},function(err){
    //     if(err) return;
    //     console.log("文件写入成功writeFile")
    // })
// 读文件
    // fs.readFile("./test/index.html",{encoding:"utf-8"},function(err,data){
    //     if(err) return;
    //     console.log(data)
    //     fs.appendFile("./test/index.html","<!-- 这是node添加的注释 -->",function(err){
    //         if(err) return ;
    //         console.log("文件追加完成")
    //     })
    // })
//  删除文件
    // fs.unlink("./test/2.txt",function(err){
    //     if(err) return;
    //     console.log("文件删除成功")
    // })

/* 下面的操作对文件或者文件夹都可以使用 */ 

// 打开文件
    // 参数说明： 参数一: 表示文件打开的路径
    //           参数二：表示打开文件的方式  读("r")/写("")
    //           参数三：表示回调函数function(err,fd);
    //           回调函数的参数第一个：表示错误，第二个表示被打开文件的标示(对这个文件操作的时候，就要根据这个值判断打开的文件是哪个)
    // fs.open("./test/1.txt","r",function(err,fd){
    //     if(err) return;
    //     console.log(fd)
    // })
// 文件夹的操作创建文件夹
    // fs.mkdir("./test1",function (err){
    //     if(err) return;
    //     console.log("文件夹创建成功");
    // })
// 读取文件夹
    // fs.readdir("./",function(err,files){
    //     if(err) return;
    //     // console.log(files)  //返回当前路径中的所有文件
    //     files.forEach(function(item){
    //         if(path.parse(item).ext == ".js"){   //判断文件的后缀名是不是.js结尾的文件
    //             console.log(item)
    //         }
    //     })
    // })
// 删除文件夹(注意：只能删除空的文件夹)
    // fs.rmdir("./test1",function(err){  
    //     if(err) throw err;
    //     console.log("文件删除成功");
    // })
// 检查文件夹/文件状态
    // fs.stat("./test",function(err,stats){
    //     if(err) return;
    //     console.log(stats);
    // })
// 文件/文件夹重命名
    // fs.rename("./test/t3.txt","./test/t33333.txt",function(err){
    //     if(err) return;
    //     console.log("文件重命名")
    // })


// 练习：找出C盘所有的。exe文件结尾的文件
    fs.readdir(path.parse(__filename).root,function(err,files){
        if(err) return;
        // console.log(files);
        files.forEach(function(item){
            if(path.parse(item).ext == ".exe"){
                console.log(item)
            }else if(path.parse(item).ext == ""){
                console.log(item)
            }
        })
    })

// 查找一个文件夹下面的所有文件(使用了递归)

var search = function(dir){
    // 读取传递进来的文件夹下面的所有文件
    fs.readdir(dir,function(err,files){
        // 遍历所有子文件和文件夹
        files.forEach(function(item){
            // 计算机子文件和文件夹的路径
            var newDir = path.join(dir,item);
            // 检查文件和文件夹的状态
            var stats = fs.statSync(newDir);
            // 判断子文件是否是文件夹
            if(stats.isDirectory()){
                // 如果是文件夹则递归这个子文件夹
                search(newDir)
            }else{
                // 如果不是文件夹则打印这个文件
                console.log(newDir)
            }
        })
    })
}
search("../nodejs");